這篇文章將探討如何利用程式從大量的評論文本中找出重要的關鍵詞,並用它們來生成文字雲,幫助我們快速掌握使用者關注的焦點。
上一篇我們將 App 評論資料從試算表讀取出來並進行了基礎統計。但光有數字還不夠,我們需要深入了解使用者在評論中到底提到了什麼。
這時候,詞頻-逆向文件頻率(TF-IDF) 分析就能派上用場。這是一種常用的文字探勘技術,能幫助我們找出那些在特定文件中重要、但在所有文件中不那麼常見的詞語。
對於中文,我們無法像英文一樣簡單地用空格來分詞。因此,我們使用 N-Gram 技術來生成詞語。
簡單來說,N-Gram 會從一段文字中,以 N 個字為單位來切割詞語。
例如,應用程式 這個詞,我們可以切成 應用、用程、程式 等 2-gram 詞語。
TfIdfService.gs 檔案中的 tokenizeChineseNGram 函式就是用來執行這項任務的。
它會將評論文本轉換成一系列的詞語清單,同時會移除標點符號和一些常見的停用詞(如「的」、「了」等)。
var STOPWORDS = new Set([
  "的","了","和","是","在","與","及","也","很","不","沒","沒有",
  "我們","你們","他們","這個","那個","如果","因此","可以","不能",
  "無法","問題","感覺","真的","超級","非常","一下","一下子"
]);
function tokenizeChineseNGram(text, minN, maxN) {
  //...(略)
  var tokens = [];
  for (var i = 0; i < src.length; i++) {
    for (var n = minN; n <= maxN; n++) {
      var g = src.slice(i, i + n);
      if (g.length === n && !STOPWORDS.has(g)) tokens.push(g);
    }
  }
  return tokens;
}
有了詞語清單後,computeTfidf 函式會計算每個詞語的 TF-IDF 分數。
此外,這個函式還特別考慮了評論的星等。
例如,評分低的評論(1-2 顆星)中的關鍵詞會被給予更高的權重,這有助於我們找出那些與負面體驗高度相關的關鍵詞。
function computeTfidf(reviews, options) {
  //...(略)
  var docs = reviews.map(function(r){
    return {
      row: r.row,
      rating: Number(r.rating) || 0,
      tokens: tokenizeChineseNGram(String(r.title || '') + String(r.review || ''))
    };
  });
  // 計算 TF-IDF 分數...
  var items = Array.from(scores.entries())
    .filter(function(e){ return (df.get(e[0]) || 0) >= minDocFreq; })
    .map(function(e){ return { text: e[0], weight: Number(e[1].toFixed(6)) }; })
    .sort(function(a,b){ return b.weight - a.weight; })
    .slice(0, 200);
  //...(略)
  return items;
}
最後,computeTfidf 函式會根據分數對詞語進行排序,並回傳前 200 個最相關的詞語。
這些關鍵詞會被我們的網頁用來生成文字雲,讓使用者一眼就能看到評論的重點!